module runtimes

import config
import webview
import os
import net
import net.http
import rand

// 获取端口
fn get_port(n u16) !u16 {
	if n == 0 {
		p := rand.int_in_range(2, 99999) or { return 99999 }
		return net.validate_port(p)!
	}
	return n
}

// 开始执行命令
fn start_exec(command string) &os.Process
{
	mut data := []string{}
	data << command.split(' ')
	filename := data[0]
	// 删除第一个元素
	data.delete(0)
	// 开始进程
	mut p := os.new_process(filename)
	p.create_no_window = true
	p.set_args(data)
	p.run()
	return p
}

// 停止执行命令
fn stop_exec(mut p &os.Process) {
	p.signal_term()
}

// 运行
pub fn run(wv &webview.Webview,rm config.Runtime)! {
	// 运行命令
	start_command := rm.start_command
	// 停止命令
	stop_command := rm.stop_command
	// 获取端口
	port := get_port(rm.port)!
	// 链接
	link := 'http://${rm.address}:${port}'
	// 启动命令
	mut start_p := start_exec(start_command)
	if stop_command.trim(' ') != ""{
		start_p.wait()
	} else {
		mut is_running := false
		for !is_running {
			// 检查链接是否可用
			resp := http.get(link) or { continue }
			if resp.status_code == 200 {
				is_running = true
			}
		}
	}
	// 打开网页
	wv.navigate(link)
	wv.run()
	// 停止命令
	if stop_command.trim(' ') != "" {
		mut stop_p := start_exec(stop_command)
		stop_p.wait()
		stop_exec(mut stop_p)
	}
	stop_exec(mut start_p)
	
	wv.destroy()
}